#pragma once

#include<sys/epoll.h>
#include<iostream>

class Epoll
{
    static const int gnum = 128;
public:
    void CreateEpoll()
    {
        _epfd = epoll_create(gnum);
        if(_epfd < 0) exit(5);
    }
    bool AddSockToEpoll(int sock, uint32_t events)
    {
        struct epoll_event ev;
        ev.events = events;
        ev.data.fd = sock;
        int n = epoll_ctl(_epfd, EPOLL_CTL_ADD, sock, &ev);
        return n == 0;
    }
    bool DelSockFromEpoll(int sock)
    {
        int n = epoll_ctl(_epfd, EPOLL_CTL_DEL, sock, nullptr);
        return n == 0;
    }
    bool CtlEpoll(int sock, uint32_t events)
    {
        events |= EPOLLET; //*******************
        struct epoll_event ev;
        ev.events = events;
        ev.data.fd = sock;
        int n = epoll_ctl(_epfd, EPOLL_CTL_MOD,sock, &ev);
        return n == 0;
    }
    int WaitEpoll(struct epoll_event revs[], int revsNum)
    {
        return epoll_wait(_epfd, revs, revsNum, _timeout);
    }
private:
    int _epfd;
    int _timeout = 1000;
};